#' 增加SNP
#'
#' @param df 是原始数据框,意思是data.frame的简称，需要包含chr,pos
#' @param build 可以选hg19,hg38,ensembl,每个选项都需要下载相应的文件。
#'              ensembl也是hg38版本，是gwas catalog网站使用的版本，已经取消使用
#'
#' @return 增加了SNP的数据框
#' @export
#'
#' @examples
#'
#' # 匹配hg19的1亿个SNP耗时半个小时
#'
#' # 设置随机数种子
#' set.seed(123)
#'
#' # 生成示例数据框
#' df <- data.frame(
#'   chr = sample(1:22, 1000, replace = TRUE),
#'   pos = sample(1:100000, 1000, replace = TRUE)
#' )
#'
#' # 使用时，需要提供build
#'
#' df1<-U1_add_SNP(df,build = "hg19" )
#' df2<-U1_add_SNP(df,build = "hg38" )
#'
#'
U1_add_SNP <- function(df = df, build = "hg19"){

  df$chr<- as.character( df$chr )
  df$pos<- as.numeric( df$pos )

  stopifnot( build %in% c("hg19","hg38","ensembl") )

  if(file.exists( paste0(file.path( tools::R_user_dir("Oneclick", which = "data") , "path.Rdata" )))){
    load(paste0(file.path( tools::R_user_dir("Oneclick", which = "data") , "path.Rdata" )))
  }else{
    stop("请用U1_set_file_path功能设置附加文件夹")
  }

  dir <- file.path(path,build)

  if( !identical(sort( dir(dir) ),sort( paste0("snp150_", 1:2, ".parquet") ) )  & (build == "hg19") ){
    stop("hg19目录下应该是snp150_1.parquet和snp150_2.parquet共2个文件",call. = FALSE)
  }

  if( !identical( sort(  dir(dir) ), sort( paste0("snp151_",1:6,".parquet") ) )  & (build == "hg38") ){
    stop("hg38目录下应该是snp151_1.parquet到snp151_6.parquet共6个文件",call. = FALSE)
  }

  if( !identical( sort(  dir(dir) ) ,sort(  paste0("ensembl_",1:25,".parquet") ) )  & (build == "ensembl") ){
    stop("ensembl目录下应该是ensembl_1.parquet到ensembl_25.parquet共25个文件",call. = FALSE)
  }


  hg <- arrow::open_dataset( dir )


  hg_left <- hg %>%
    dplyr::inner_join( df, by = c("chr","pos"))%>%
    dplyr::collect()

  cat("注释比例为",sprintf("%0.1f%%", (nrow(hg_left)/nrow(df)) * 100) ,"。原始个数为",nrow(df),",注释了", nrow(hg_left),"个。\n" )

  return(hg_left)
}




